package stone;

import java.util.ArrayList;
import java.math.*;


public class Map {
	private int [][] mKarte;
	private ArrayList<Stein> mStones = new ArrayList<Stein>();
	private ArrayList<int[]> mTargets = new ArrayList<int[]>();
	//ArrayList of all Stones
	
	public Map() {
		this(20);
	}
	
	public Map(int x) {
		this(x,x);
	}
	public Map(int x, int y) {
		this(new int[x][y]);
		clearMap();
	}
	public Map(int [][] karte) {
		if (errorAtMap(karte)) System.exit(2020);
		this.mKarte = karte;		
	}
	//nullarray abfangen.
	public void clearMap() {
		
		for (int i=0; i< mKarte.length; i++){
			for (int j=0;j<mKarte[0].length; j++){
				mKarte[i][j] = 0;			
			}
		}
	}
	public int [][] getMap() {
		return mKarte;
	}
	public void setMap(int [][] karte) {
		this.mKarte = karte;
	}
	// karte[0] abfangen, negative werte
	public int getEntry(int x, int y) {
		if ((mKarte.length > x) && (mKarte[0].length > y))
			return mKarte[x][y];
		return -1;
	}
	public int getBColorEntry(int x, int y) {
		if ((mKarte.length > x) && (mKarte[0].length > y))
			return mKarte[x][y];
		return -1;
	}
	//abfangen
	public void setEntry(int x,int y, int entry) {
		mKarte[x][y] = entry;
	}
	public int getWidth(){
		if (errorAtMap(mKarte)) return 0;
		return mKarte[0].length;
	}
	public int getHeight(){
		if (errorAtMap(mKarte)) return 0;
		return mKarte.length;
	}
	// Prueft ob eine Map (ein array) initalisiert?! wurde und ob dieser groesser 0 ist.
	public boolean errorAtMap(int[][] k) {
		if ((k==null) || (k.length < 1) || (k[0].length < 1)) return true;
		return false;
	}

	// Stein an vorbestimmte Stelle platzieren
	public void addStein(Stein s, int x, int y) {
		//check ob stein da liegen darf...
		if ((x+s.getWidth())>this.getWidth()) System.exit(21);
		if ((y+s.getHeight())>this.getHeight()) System.exit(22);
		// 1,3
		// 2,4
		for (int i=0; i < s.getHeight(); i++) {		//y-Achse: i
			for (int j=0; j < s.getWidth(); j++) {	//x-Achse: j
				if (s.getEntry(j, i)) this.setEntry(j+x, i+y, s.getFarbcode());
			}
		}
	}
	public void addStein(Stein s) {
		addStein(s, s.getX(),s.getY());
	}
	public void addTarget(int x, int y){
		mTargets.add(new int[]{x,y});
		System.out.println(mTargets.remove(new int[]{x,y}));
	}
	public BColor parseIntToBColor(int c) {
		if (c==0) return null;
		c =(int) Math.sqrt(c);
		switch (c) {
			case 2: 	return BColor.blue;			
			case 4: 	return BColor.red;
			case 8:		return BColor.yellow;
			case 16: 	return BColor.green;			    
			case 1: 	return BColor.empty;
	     
			default:	return null;
		}
	}
	public int parseBColorToInt(BColor c) {
		switch (c) {
			case blue: 	return 2;			
			case red: 	return 4;
			case yellow:return 8;
			case green: return 16;			    
			case empty: return 1;
		     
			default:	return 0;
		}
	}
	// pruefen, ob stein gelegt werden kann.
	public boolean checkFreePosition(int x, int y) {
		if ((mKarte.length > x) && (mKarte[0].length > y)) {
			System.out.println("x: " +x + " y: " + y);
			if (mKarte[y][x] != 0) return false;
			else return true;
		}
		System.exit(47);
		return false;
	}
}
